package ec.edu.ups.cidi.siia.plamdep.moduloweb.servicio;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.DependsOn;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;

import ec.edu.ups.cidi.siia.deteccionimg.ServicioWeb;
import ec.edu.ups.cidi.siia.deteccionimg.ServicioWebService;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.Ejecutor;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos.AlgComparacionContainer;
import ec.edu.ups.cidi.siia.plamdep.ejecutor.GestionAlgoritmos.AlgExtractorContainer;
import ec.edu.ups.cidi.siia.plamdep.utils.configuracion.ConfiguracionGlobal;
import ec.edu.ups.cidi.siia.plamdep.utils.interfaces.*;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.dao.AlgoritmosDAO;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.dao.AnalisisDAO;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.jms.SolicitudAnalisisJMS;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.modeloBD.Algoritmo;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.modeloBD.Analisis;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.notificaciones.Notificaciones;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.reportes.Reporte;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.reportes.ReporteCabecera;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.reportes.ReporteDetalle;
import ec.edu.ups.cidi.siia.plamdep.moduloweb.utils.Fechas;

@Singleton
@Startup
@DependsOn("AlgoritmosDAO")

public class ProcesamientoPeticiones 
{
	
		@Inject AlgoritmosDAO algDao;
		@Inject Reporte reporte;
		@Inject Notificaciones notificacion;
		@Inject AnalisisDAO anlDao;
		
		static Ejecutor plataforma=	plataforma=new Ejecutor( new ArrayList<AlgComparacionContainer>(), new ArrayList<AlgExtractorContainer>());
		public Runnable procesoCargaAlgoritmos=new Runnable() {
			
			public void run() {
				try{
					//Thread.sleep(8000);
					System.out.println("Cargando Metadatos algoritmos.................................");
					 List<AlgComparacionContainer> algscom=new ArrayList();
					 List<AlgExtractorContainer> algsex=new ArrayList();		
				
					 List<Algoritmo> metadatos=algDao.listarAlgoritmosComparacion();
					 for(Algoritmo met:metadatos)
					 {
						 AlgComparacionContainer alg=new AlgComparacionContainer();
						 alg.setClassName(met.getCanonicalName());
						 alg.setNombre(met.getNombre());
						 alg.setRutaAlgoritmo(met.getRuta());
						 
						 algscom.add(alg);
					 }
					 
					 metadatos=algDao.listarAlgoritmosExtraccion();
					 for(Algoritmo met:metadatos)
					 {
						 AlgExtractorContainer alg=new AlgExtractorContainer();
						 alg.setClassName(met.getCanonicalName());
						 alg.setNombre(met.getNombre());
						 alg.setRutaAlgoritmo(met.getRuta());
						 
						 algsex.add(alg);
					 }
					
					 System.out.println("Arranca.................................");
					 Ejecutor.cargarAlgoritmos(algscom, algsex);
					 
					 
			    	
			    	
	               }catch(Exception ex){ex.printStackTrace();}
			}
		};
	
		@PostConstruct
	    public void arrancar() 
	    {
			Thread t=new Thread(procesoCargaAlgoritmos);
	    	t.start();	    
	    }
	
		
	    
		/**
		 * Metodo que recibe la peticion de analisis desde la cola JMS
		 * Se encarga de mandar a ejecutar los analisis y de invocar la generacion de reportes
		 * @param sol
		 */
		public void analizar(SolicitudAnalisisJMS sol)
		{
			String codPeticion =sol.getCodSolicitud();

			Analisis anl=anlDao.buscarPorPeticion(codPeticion);
			anl.setEstado("Analizando");
			anlDao.update(anl);
			
				System.out.println("Analisis iniciado...\n"+sol.toString());
				List<ResultadoFinal> result=analisisTextual(sol);
				String pathReport=generarReporte(sol, result);
				System.out.println("Analisis terminado reporte en:"+pathReport+" total resultados:"+result.size());
				anl.setEstado("Terminado");
				anl.setReporte(pathReport);
				anlDao.update(anl);	
				
				//solicitudAnalisisImagenes(sol.getRutaArchivoSospechoso(), sol.getNumeroImg());
				
		}
		private String generarReporte(SolicitudAnalisisJMS sol,	List<ResultadoFinal>  resultados)
		{
			ReporteCabecera rc=new ReporteCabecera();
	        rc.setAlgoritmoComparacion(sol.getCodigoAlgoritmoComparacion());
	        rc.setAlgoritmoExtracion(sol.getCodigoAlgoritmoExtraccion());
	        rc.setCorreo(sol.getMailUsuario());
	        rc.setFechaAnalisis(new Fechas().fechaActual);
	        rc.setHoraAnalisis(new Fechas().horaActual);
	        rc.setFechaSolicitud(sol.getFecha());
	        rc.setHoraSolicitud(sol.getHora());
	        String [] doc=sol.getRutaArchivoSospechoso().split("\\|/");
	        rc.setDocumento(doc[doc.length-1]);
	        
	        List<ReporteDetalle> detalleList=new ArrayList<ReporteDetalle>();
	        
	        
	      
	        //calcular promedio de plagio
	        double acu=0;
	        int cont=0;
	        for(ResultadoFinal result:resultados)
	        {
	        	if(result.getPlagioDocPorcentaje()>0) //filtra solo los que se detecto plagio
	        	{	
	        		acu=acu+result.getPlagioDocPorcentaje();
	        		cont++;
			        ReporteDetalle det=new ReporteDetalle();
			        det.setFuente(result.getFuente().getRutaOrigen());
			        det.setTipoFuente(result.getFuente().getTipo());
			        det.setPorcentajePlagio(result.getPlagioDocPorcentaje()+"");
			        detalleList.add(det);
	        	}
	        }
	        rc.setTotalPlagio(acu/cont);
	        
	        String destFileName =ConfiguracionGlobal.pathResources+"/reports_repositorio/reportPlagio_"+sol.getCodSolicitud()+".pdf";

	        reporte.generarReporte(rc, detalleList,sol.getCodSolicitud(),destFileName);
	        
	        
	        notificacion.enviarNotificacion(destFileName, sol.getMailUsuario());
	        return destFileName;
		}
		
		private 	List<ResultadoFinal> analisisTextual(SolicitudAnalisisJMS sol)
		{
			List<ResultadoFinal> result=null;
			
			try
			{
				String codPeticion =sol.getCodSolicitud();
				Analisis anl=anlDao.buscarPorPeticion(codPeticion);
				try{
				result= plataforma.analizar(sol.getRutaArchivoSospechoso(),sol.getCodigoAlgoritmoComparacion(),sol.getCodigoAlgoritmoExtraccion(),sol.isBusquedaWeb(), sol.getFuentesLocales());
				}catch(Exception ex){
					System.out.println("Error al analizar..");
					anl.setEstado("Error en analisis");
					anlDao.update(anl);
					result=new ArrayList();
					ex.printStackTrace();

				}
				
				
			}catch(Exception e)
			{
				
			}
			return result;
		}
		
		
		public void solicitudAnalisisImagenes(String ruta, int numImagenes)
		{
			
			
			try {
				
				
				
				ServicioWebService servicio= new ServicioWebService (new URL("http://localhost:8081/servicioWeb?wsdl"));
			    ServicioWeb cliente =servicio.getServicioWebPort();
				//System.out.println("Copiando ruta:"+ruta );
				
		//		String comando="pscp -pw juanpa "+ruta+" JL@186.43.197.224:/home/JL/Documentos/archivosTesis/";
			//	System.out.print("ejecutar:"+comando);
//				Process process = Runtime.getRuntime().exec(comando);
	//			System.out.println("success");
				cliente.solicitud(ruta, numImagenes);
				
			} catch (IOException e) {e.printStackTrace();}			
		}
		public void esperaAnalisisImagenes()
		{
			try{
				int tiempoEspera=5;
				boolean terminado=false;
				while(!terminado)
				{
					ServicioWebService servicio= new ServicioWebService (new URL("http://localhost:8081/servicioWeb?wsdl"));
				    ServicioWeb cliente =servicio.getServicioWebPort();
				}
				
				Thread.sleep(1000*tiempoEspera);
			
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		
		
		
		
		
}
